package org.darcy.controller.admin.user;

import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.darcy.entity.SysUser;
import org.darcy.framework.annotation.BussinessLog;
import org.darcy.framework.blog.business.enums.ResponseStatus;
import org.darcy.framework.model.PageResult;
import org.darcy.framework.model.ResponseVO;
import org.darcy.framework.util.PasswordUtil;
import org.darcy.framework.util.ResultUtil;
import org.darcy.model.SysUserModel;
import org.darcy.service.SysUserRoleService;
import org.darcy.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import cn.hutool.core.util.StrUtil;

/**
 * 用户管理
 */
@RestController
@RequestMapping("/user")
public class UserController {

	@Autowired
	private SysUserService userService;

	@Autowired
	private SysUserRoleService userRoleService;

	@RequiresPermissions("users")
	@PostMapping("/list")
	public PageResult list(SysUserModel param) {
		Page p = new Page(param.getP(), param.getPageSize());
		QueryWrapper<SysUser> q = new QueryWrapper<SysUser>();
		if (StrUtil.isNotEmpty(param.getKeywords())) {
			q.like("username", param.getKeywords());
			q.or().like("nickname", param.getKeywords());
			q.or().like("mobile", param.getKeywords());
		}

		IPage pageInfo = userService.getPage(p, q);
		return ResultUtil.tablePage(pageInfo);
	}

	/**
	 * 保存用户角色
	 *
	 * @param userId
	 * @param roleIds 用户角色 此处获取的参数的角色id是以 “,” 分隔的字符串
	 * @return
	 */
	@RequiresPermissions("user:allotRole")
	@PostMapping("/saveUserRoles")
	@BussinessLog("分配用户角色")
	public ResponseVO saveUserRoles(Long userId, String roleIds) {
		if (StringUtils.isEmpty(userId)) {
			return ResultUtil.error("error");
		}
		userRoleService.addUserRole(userId, roleIds);
		return ResultUtil.success("成功");
	}

	@RequiresPermissions("user:add")
	@PostMapping(value = "/add")
	@BussinessLog("添加用户")
	public ResponseVO add(SysUser user) {
		SysUser u = userService.getByUserName(user.getUsername());
		if (u != null) {
			return ResultUtil.error("该用户名[" + user.getUsername() + "]已存在！请更改用户名");
		}
		try {
			user.setPassword(PasswordUtil.encrypt(user.getPassword(), user.getUsername()));
			userService.insert(user);
			return ResultUtil.success("成功");
		} catch (Exception e) {
			e.printStackTrace();
			return ResultUtil.error("error");
		}
	}

	@RequiresPermissions(value = { "user:batchDelete", "user:delete" }, logical = Logical.OR)
	@PostMapping(value = "/remove")
	@BussinessLog("删除用户")
	public ResponseVO remove(Long[] ids) {
		if (null == ids) {
			return ResultUtil.error(500, "请至少选择一条记录");
		}
		for (Long id : ids) {
			userService.delete(id);
			userRoleService.removeByUserId(id);
		}
		return ResultUtil.success("成功删除 [" + ids.length + "] 个用户");
	}

	@RequiresPermissions("user:get")
	@PostMapping("/get/{id}")
	@BussinessLog("获取用户详情")
	public ResponseVO get(@PathVariable Long id) {
		return ResultUtil.success(null, this.userService.getById(id));
	}

	@RequiresPermissions("user:edit")
	@PostMapping("/edit")
	@BussinessLog("编辑用户")
	public ResponseVO edit(SysUser user) {
		try {
			userService.update(user);
		} catch (Exception e) {
			e.printStackTrace();
			return ResultUtil.error("用户修改失败！");
		}
		return ResultUtil.success(ResponseStatus.SUCCESS);
	}

}
